package com.wyx.suanfa;

import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author 王艺锡
 * @version 1.0
 */
public class numSquares {
    //给你一个整数 n ，返回 和为 n 的完全平方数的最少数量 。
    //
    //完全平方数 是一个整数，其值等于另一个整数的平方；换句话说，其值等于一个整数自乘的积。
    // 例如，1、4、9 和 16 都是完全平方数，而 3 和 11 不是。

    public static final Object lock = new Object();
    public static int  count = 1;
    public static final int maxcount = 100;
    public static void main(String[] args) {
        numSquares numSquares = new numSquares();
        numSquares.printOdd();
        numSquares.printEven();
    }

    public void printOdd(){
        new Thread(() -> {
            synchronized (lock){
                while(count <= maxcount){
                    if(count % 2 == 0){
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else {
                        System.out.println(Thread.currentThread() + ": " + count++);
                        lock.notify();
                    }
                }
            }
        },"Odd").start();
    }

    public void printEven(){
        new Thread(() -> {
            synchronized (lock){
                while(count <= maxcount){
                    if(count % 2 == 1){
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else{
                        System.out.println(Thread.currentThread() + ": " + count++);
                        lock.notify();
                    }

                }
            }
        },"Even").start();
    }
}
/*
* class Solution {
    public int numSquares(int n) {
        // dp[n] : 表示n是由[1~n]中各个数的平方和相加等于n的最少数量，
        //比如dp[12] = 2^2 + 2^2 + 2^2，使用了3次2的平方。
        int[] dp = new int[n + 1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0] = 0;

        for(int i = 1;i<= n;i++){
            for(int j = 1;j * j <= i;j++){
                dp[i] = Math.min(dp[i],dp[i - j * j] + 1);
            }
        }
        return dp[n];
    }
}*/